<?php

// 全局公共函数

// +----------------------------------------------------------------------
// | 接口响应格式定义
// +----------------------------------------------------------------------

use liang\MicroEngine;

/**
 * 操作成功
 *
 * @param string $msg
 * @param string $name
 */
function success(string $msg = "", $name = 'success')
{
    $code = config('code.' . $name);
    return json(compact('code', 'msg'));
}

/**
 * 发生错误
 *
 * @param string $msg
 * @param string $name
 */
function fault(string $msg = "", string $name = 'fault')
{
    throw new \Exception($msg, config('code.' . $name));
}

/**
 * 返回数据
 *
 * @param array   $data
 * @param string  $msg
 * @param mixed   $code
 */
function data(array $data, string $msg = "获取成功", $name = 'success')
{
    $code  = is_numeric($name) ? $name : config('code.' . $name);
    return json(compact('code', 'msg', 'data'));
}

// +----------------------------------------------------------------------
// | 兼容独立版、微擎版路由地址
// +----------------------------------------------------------------------

/**
 * 兼容微擎版、独立版
 * 
 * 前后台应用微擎路由通用生成方法
 * 
 * @author  liang
 * @example u('index')
 * @example u('user/login', ['id' => 1])
 * @example u('merchType/getLists', ['id' => 2])
 * 
 */
function u(...$param): string
{
    // 判断当前是否在微擎框架中
    if (MicroEngine::isMicroEngine()) {
        // 应用 模块 方法
        $contro = request()->controller();
        // 微擎框架自带参数
        $weParam = request()->only(['i', 'c', 'a', 'eid', 'version_id', 'do', 'm'], 'get');
        // 路由参数
        $route = explode('/', $param[0] ?? ''); // ?? 处理编辑器报红
        // parse_name 控制器驼峰命名转为下划线分隔命名
        switch (count($route)) {
            case 1: // u('index')
                $path = ['', parse_name($contro), $route[0]];
                break;
            case 2: // u('index/index')
                $path = ['', parse_name($route[0]), $route[1]];
                break;
        }
        $s = implode('/', $path);
        $url = request()->domain() . request()->baseFile() . '?' . queryString($weParam) . '&s=' . $s;
        if (!empty($param[1])) $url .= '&' . queryString($param[1]);
        return $url;
    } else {
        // 独立版
        $contro = request()->controller();
        $route = explode('/', $param[0] ?? '');
        switch (count($route)) {
            case 1: // u('index')
                $path = ['', parse_name($contro), $route[0]];
                break;
            case 2: // u('index/index')
                $path = ['', parse_name($route[0]), $route[1]];
                break;
        }
        $s = implode('/', $path);
        $param[0] = $s;
        return request()->domain() . url(...$param);
    }
}

/**
 * 将数组数据转为查询字符串
 */
function queryString($data)
{
    $link = '';
    foreach ($data as $key => $value) {
        $link .= $key . '=' . trim($value) . '&';
    }
    return rtrim($link, '&');
}

// +----------------------------------------------------------------------
// | 查询条件数据格式转换
// +----------------------------------------------------------------------

/**
 * 用于搜索器
 * 去掉数组空字符串,返回所有键
 *
 * @param  array $where
 * @param  array $keys
 * @return array 适用于withSearch()的数组
 */
function where_filter(&$keys, array $where)
{
    // 去掉数组里的空字符串和null
    $where = array_filter($where, function ($k) {
        return ($k === '' || $k === null) ? false : true;
    });
    // 拿到所有键
    $keys = array_keys($where);
    // 返回数组
    return $where;
}

/**
 * 对数据进行JSON编码并且中文不转义
 *
 * @param mixed $data 需要编码的数据
 */
function encode($data)
{
    return json_encode($data, JSON_UNESCAPED_UNICODE);
}
